package mid;

import java.util.LinkedList;

/**
 定义栈的数据结构，请在该类型中实现一个能够得到栈中所含最小元素的 min 函数，输入操作时保证 pop、top 和 min 函数操作时，栈中一定有元素。

 此栈包含的方法有：
 push(value):将value压入栈中
 pop():弹出栈顶元素
 top():获取栈顶元素
 min():获取栈中最小元素

 数据范围：操作数量满足 0 \le n \le 300 \0≤n≤300  ，输入的元素满足 |val| \le 10000 \∣val∣≤10000
 进阶：栈的各个操作的时间复杂度是 O(1)\O(1)  ，空间复杂度是 O(n)\O(n)

 示例:
 输入:    ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]
 输出:    -1,2,1,-1
 解析:
 "PSH-1"表示将-1压入栈中，栈中元素为-1
 "PSH2"表示将2压入栈中，栈中元素为2，-1
 “MIN”表示获取此时栈中最小元素==>返回-1
 "TOP"表示获取栈顶元素==>返回2
 "POP"表示弹出栈顶元素，弹出2，栈中元素为-1
 "PSH1"表示将1压入栈中，栈中元素为1，-1
 "TOP"表示获取栈顶元素==>返回1
 “MIN”表示获取此时栈中最小元素==>返回-1
 *
 * @author WangZhiJian
 * @since 2022/1/20
 */
public class 包含min函数的栈 {
    //正常数组
    private LinkedList<Integer> stack = new LinkedList<>();
    // 最小数组
    private LinkedList<Integer> minStack;

    public void push(int node) {
        // 正常数组放入
        stack.push(node);
        // 最小数组为空则放入
        if(minStack.isEmpty())
            minStack.push(node);
        // 不为空放入最小数组的最后一位和当前值中较小的一个
        else
            minStack.push(Math.min(minStack.peek(),node));
    }

    public void pop() {
        // 一同出栈
        stack.pop();
        minStack.pop();
    }

    public int top() {
        return stack.peek();
    }
    // 返回最小数组的第一个
    public int min() {
        return minStack.peek();
    }
}
